package net.siufung.core.page;

import java.io.Serializable;
import java.util.List;

/**
 * @author 陈建峰
 * @since 2022/6/22 4:00 下午
 */
public interface IPager<T> extends Serializable {
    /**
     * 获取分页数据
     * @return 数据列表
     */
    List<T> getRecords();

    /**
     * 设置数据
     * @param records 数据
     * @return IPager<T>
     */
    IPager<T> setRecords(List<T> records);

    /**
     * 获得总条数
     * @return Long
     */
    Long getTotal();

    /**
     * 设置总条数
     * @param total 总条数
     * @return IPager
     */
    IPager<T> setTotal(Long total);

    /**
     * 获取分页大小
     * @return 分页大小
     */
    Long getPageSize();

    /**
     * 设置分页大小
     * @param pageSize 分页大小
     * @return IPager<T>
     */
    IPager<T> setPageSize(Long pageSize);

    /**
     * 获取当前页号
     * @return 当前页号
     */
    Long getPageNo();

    /**
     * 获取当前页号
     * @param pageNo 当前页号
     * @return IPager<T>
     */
    IPager<T> setPageNo(Long pageNo);

    /**
     * 获取总页数
     * @return 总页数
     */
    default Long getPages() {
        if (this.getPageSize() == 0L) {
            return 0L;
        } else {
            long pages = this.getTotal() / this.getPageSize();
            if (this.getTotal() % this.getPageSize() != 0L) {
                ++pages;
            }
            return pages;
        }
    }

    /**
     * 获取总页数
     * @param pages 页数
     * @return IPager<T>
     */
    default IPager<T> setPages(long pages) {
        return this;
    }

    /**
     * 还有上一条数据
     * @return true or false
     */
    default Boolean hasPrev() {
        return this.getPageNo() > 1L;
    }

    /**
     * 还有下一条数据
     * @return true or false
     */
    default Boolean hasNext() {
        return this.getPageNo() < this.getPages();
    }

}
